package facede

import (
	"context"
	"ginfwk/infrastructure/component/logger"
	"go.uber.org/zap"
)

// 定义自定义类型,防止被解析到gin.Context.Value
var (
	LogMetaKey = "__log_meta_key"
)

type logMetaData struct {
	TraceId string
	SpanId  string
}

func NewLoggerContext(ctx context.Context, traceId, spanId string) context.Context {
	return context.WithValue(ctx, LogMetaKey, &logMetaData{
		TraceId: traceId,
		SpanId:  spanId,
	})
}

func CtxLogger(ctx context.Context) (ctxLogger *zap.SugaredLogger) {
	// 生成trace信息
	ctxLogger = logger.Clone().WithOptions()
	ctxMetaValue := ctx.Value(LogMetaKey)
	if logMeta, ok := ctxMetaValue.(*logMetaData); ok {
		return ctxLogger.With(
			zap.String("traceId", logMeta.TraceId),
			zap.String("spanId", logMeta.SpanId),
		)
	}
	return ctxLogger
}
